package class_object;

// 父类（基类）
class Animal {
    protected String name;

    public Animal(String name) {
        this.name = name;
    }

    // 父类的方法
    public void eat() {
        System.out.println(name + "在吃东西");
    }

    public void sleep() {
        System.out.println(name + "在睡觉");
    }
}

// 子类（派生类），使用extends继承父类
class Dog extends Animal {
    // 子类新增属性
    private String breed;

    // 子类构造方法，必须调用父类构造方法
    public Dog(String name, String breed) {
        super(name); // 调用父类的构造方法，必须放在第一行
        this.breed = breed;
    }

    // 子类新增方法
    public void bark() {
        System.out.println(name + "在汪汪叫");
    }

    // 重写（Override）父类的方法
    @Override
    public void eat() {
        System.out.println(name + "（" + breed + "）在吃狗粮");
    }
}

// 另一个子类
class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }

    public void meow() {
        System.out.println(name + "在喵喵叫");
    }

    // 重写父类方法
    @Override
    public void eat() {
        System.out.println(name + "在吃猫粮");
    }
}

public class InheritanceDemo {
    public static void main(String[] args) {
        Dog dog = new Dog("旺财", "金毛");
        dog.eat();    // 调用重写后的方法
        dog.sleep();  // 继承父类的方法
        dog.bark();   // 子类自己的方法

        Cat cat = new Cat("咪咪");
        cat.eat();    // 调用重写后的方法
        cat.sleep();  // 继承父类的方法
        cat.meow();   // 子类自己的方法

        // 多态：父类引用指向子类对象
        Animal animal = new Dog("小白", "萨摩耶");
        animal.eat(); // 实际调用的是Dog类的eat()方法
    }
}
